package sesi.ejava.monitoring;

import sesi.ejava.bcam.R;
import sesi.ejava.settings.BaseSettings;
import sesi.ejava.stream.MonitoringInputStream;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Cette classe permet de faire l'affichage des informations récupérées par le
 * moteur via le bluetooth. On utilise la classe {@link MonitoringInputStream}.
 * On affichera la vitesse du moteur, la température, le niveau d'huile, le rpm
 * 
 * @see MonitoringInputStream
 * 
 * @author stephane
 * 
 */
public class MonitoringActivity extends Activity {

	private TextView txtTemperatureUnit;
	private TextView txtVitesse;
	private TextView txtVitesseTour;
	private ProgressBar barHuile;
	private ProgressBar barEssence;
	private RadioButton vitesseR;
	private RadioButton vitesseN;
	private RadioButton vitesse1;
	private RadioButton vitesse2;
	private RadioButton vitesse3;
	private RadioButton vitesse4;
	private RadioButton vitesse5;
	private RadioButton vitesse6;
	private MonitoringInputStream monitoringInputStream;
	private BaseSettings settings;
	private int temp, transmission, vitesse, nombrevitesse, niv_huile,
			max_huile, max_essence, niv_essence, tour_minute;
	private boolean unite_temp, unite_vitesse;
	private RefreshThread thread;
	


	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		txtTemperatureUnit 	= (TextView) 	findViewById(R.id.textViewTemp3);
		txtVitesse		 	= (TextView) 	findViewById(R.id.textvitesse);
		txtVitesseTour	 	= (TextView) 	findViewById(R.id.textVitesseTour);
		barHuile			= (ProgressBar) findViewById(R.id.progressBarHuile);
		barEssence			= (ProgressBar) findViewById(R.id.progressBarEssence);
		vitesseR			= (RadioButton)	findViewById(R.id.radioButtonVitesseR);
		vitesseN			= (RadioButton)	findViewById(R.id.radioButtonVitesseN);
		vitesse1			= (RadioButton)	findViewById(R.id.radioButtonVitesse1);
		vitesse2			= (RadioButton)	findViewById(R.id.radioButtonVitesse2);
		vitesse3			= (RadioButton)	findViewById(R.id.radioButtonVitesse3);
		vitesse4			= (RadioButton)	findViewById(R.id.radioButtonVitesse4);
		vitesse5			= (RadioButton)	findViewById(R.id.radioButtonVitesse5);
		vitesse6			= (RadioButton)	findViewById(R.id.radioButtonVitesse6);
	
		monitoringInputStream = MonitoringInputStream.getInstance();
		settings = BaseSettings.getsettingsSingleton(this);


		setContentView(R.layout.monitoring_activity);


		thread = new RefreshThread();
		thread.start();
	}

	protected void onStart() {
		super.onStart();

		recuperation_valeur();

	}

	@Override

	protected void onPause() {
		super.onPause();

	}

	
	@Override

	protected void onResume() {
		super.onResume();

	}

	private class RefreshThread extends Thread {		
		@Override
		public void run() {

			while (true) {
				Message msg = handler
						.obtainMessage(0);
				handler.sendMessage(msg);
				
				try {
					sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
					this.stop();
				}
			}
		}

	}

	private final Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0:
				recuperation_valeur();
				break;
			}
		}
	};
	
	
	private void setupMonitoring() {
		txtTemperatureUnit = (TextView) findViewById(R.id.textViewTemp3);
		txtVitesse = (TextView) findViewById(R.id.textvitesse);
		txtVitesseTour = (TextView) findViewById(R.id.textVitesseTour);
		barHuile = (ProgressBar) findViewById(R.id.progressBarHuile);
		barEssence = (ProgressBar) findViewById(R.id.progressBarEssence);
		vitesseR = (RadioButton) findViewById(R.id.radioButtonVitesseR);
		vitesseN = (RadioButton) findViewById(R.id.radioButtonVitesseN);
		vitesse1 = (RadioButton) findViewById(R.id.radioButtonVitesse1);
		vitesse2 = (RadioButton) findViewById(R.id.radioButtonVitesse2);
		vitesse3 = (RadioButton) findViewById(R.id.radioButtonVitesse3);
		vitesse4 = (RadioButton) findViewById(R.id.radioButtonVitesse4);
		vitesse5 = (RadioButton) findViewById(R.id.radioButtonVitesse5);
		vitesse6 = (RadioButton) findViewById(R.id.radioButtonVitesse6);

		/**
		 * Récupération de l'unité d'affichage de la température et convertion
		 * de celle-ci dans la bonne unité
		 */

		
		// Température
		if (unite_temp == true) {
			// Unité °C
			txtTemperatureUnit.setText(Integer.toString(temp) + " °C");
		} else {
			// Unité °F
			temp = (((9 * temp) / 5) + 32); // Formule de convertion Celcius en
											// Fahrenheit
			txtTemperatureUnit.setText(Integer.toString(temp) + " °F");
		}

		
		// Vitesse

		if (unite_vitesse == true) {
			txtVitesse.setText(Integer.toString(vitesse) + " Km/h");
		} else {
			vitesse = (int) (vitesse * 0.6215);
			txtVitesse.setText(Integer.toString(vitesse) + " Mph");
		}

		txtVitesseTour.setText(Integer.toString(tour_minute));

		// Huile Moteur
		barHuile.setProgress(niv_huile);
		barHuile.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), Integer.toString(niv_huile)+" %", Toast.LENGTH_LONG).show();
				
			}
		});
		// Essence

		barEssence.setProgress(niv_essence);
		barEssence.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), Integer.toString(niv_essence)+" %", Toast.LENGTH_LONG).show();
				
			}
		});
		

		// Rapport de transmission
		if (nombrevitesse == 6) {
			vitesse6.setVisibility(View.VISIBLE);
			vitesse5.setVisibility(View.VISIBLE);
		} else if (nombrevitesse == 5) {
			vitesse6.setVisibility(View.GONE);
			vitesse5.setVisibility(View.VISIBLE);
		} else {
			vitesse6.setVisibility(View.GONE);
			vitesse5.setVisibility(View.GONE);
		}
		switch (transmission) {
		case 0:
			vitesseR.setChecked(false);
			vitesseN.setChecked(true);
			vitesse1.setChecked(false);
			vitesse2.setChecked(false);
			vitesse3.setChecked(false);
			vitesse4.setChecked(false);
			vitesse5.setChecked(false);
			vitesse6.setChecked(false);
			break;
		case 1:
			vitesseR.setChecked(false);
			vitesseN.setChecked(false);
			vitesse1.setChecked(true);
			vitesse2.setChecked(false);
			vitesse3.setChecked(false);
			vitesse4.setChecked(false);
			vitesse5.setChecked(false);
			vitesse6.setChecked(false);
			break;
		case 2:
			vitesseR.setChecked(false);
			vitesseN.setChecked(false);
			vitesse1.setChecked(false);
			vitesse2.setChecked(true);
			vitesse3.setChecked(false);
			vitesse4.setChecked(false);
			vitesse5.setChecked(false);
			vitesse6.setChecked(false);
			break;
		case 3:
			vitesseR.setChecked(false);
			vitesseN.setChecked(false);
			vitesse1.setChecked(false);
			vitesse2.setChecked(false);
			vitesse3.setChecked(true);
			vitesse4.setChecked(false);
			vitesse5.setChecked(false);
			vitesse6.setChecked(false);
			break;
		case 4:
			vitesseR.setChecked(false);
			vitesseN.setChecked(false);
			vitesse1.setChecked(false);
			vitesse2.setChecked(false);
			vitesse3.setChecked(false);
			vitesse4.setChecked(true);
			vitesse5.setChecked(false);
			vitesse6.setChecked(false);
			break;
		case 5:
			vitesseR.setChecked(false);
			vitesseN.setChecked(false);
			vitesse1.setChecked(false);
			vitesse2.setChecked(false);
			vitesse3.setChecked(false);
			vitesse4.setChecked(false);
			vitesse5.setChecked(true);
			vitesse6.setChecked(false);
			break;
		case 6:
			vitesseR.setChecked(false);
			vitesseN.setChecked(false);
			vitesse1.setChecked(false);
			vitesse2.setChecked(false);
			vitesse3.setChecked(false);
			vitesse4.setChecked(false);
			vitesse5.setChecked(false);
			vitesse6.setChecked(true);
			break;

		default:
			vitesseR.setChecked(true);
			vitesseN.setChecked(false);
			vitesse1.setChecked(false);
			vitesse2.setChecked(false);
			vitesse3.setChecked(false);
			vitesse4.setChecked(false);
			vitesse5.setChecked(false);
			vitesse6.setChecked(false);
			break;
		}
		// recuperation_valeur();
	}

	// Méthode de récupération des valeurs toute les 1000ms
	public void recuperation_valeur() {
		monitoringInputStream = MonitoringInputStream.getInstance();
		settings 			  = BaseSettings.getsettingsSingleton(this);
		// recupération de l'unité de température
		unite_temp 			  = settings.getTUnit();
		// récupération de la température
		temp 				  = (int) monitoringInputStream.getTemperature();
		// récupération de l'unité de vitesse
		unite_vitesse 		  = settings.getSUnit();
		// récupération de la vitesse
		vitesse 			  = (int) monitoringInputStream.getSpeed();
		// récupération de nombre de tours par minute
		tour_minute 		  = (int) monitoringInputStream.getRpm();
		// récupération de la quantité d'huile
		max_huile 			  = settings.getQOil();
		// calcul du niveau d'huile
		niv_huile 			  = (((int) monitoringInputStream.getMotorOil()) * 100)
				                / max_huile;
		// récupération de la quantité d'essence
		max_essence 		  = settings.getQGaz();
		// calcul du niveau d'essence
		niv_essence 		  = ((int) monitoringInputStream.getGas() * 100)
				                / max_essence;
		// récupération du rapport de transmission
		transmission 		  = ((int) monitoringInputStream.getGear());
		// récupération du nombre de rapport
		nombrevitesse 		  = settings.getNGear();
		setupMonitoring();
	}
}
